//
//  MultithreadSafeViewController.swift
//  YUANSHI
//
//  Created by pro on 2020/1/13.
//  Copyright © 2020 wangbin. All rights reserved.


import UIKit

class MultithreadSafeViewController: WBBaseViewController {
    
    var ticket = 10000
    override func viewDidLoad() {
        super.viewDidLoad()
        self.title = "线程安全"
        //        原子操作
        //        对于一个资源，在写入或读取时，只允许在一个时刻一个角色进行操作，则为原子操作。Swift中 let 声明的资源，永远是原子性的。在我们购买火车票时需要保证票数不会在多个线程中同时进行修改，这时就可以使用这种方式来实现。
        //
        
//        for i in 1 ... 200 {
//            objc_sync_enter(ticket)
//            buyTicket(userName: "hc\(i)")
//
//        }
        //数组线程安全
        arrSecurity()
        
        
    }
    
    func buyTicket(userName : String) {
        
        DispatchQueue.global().async {
//            objc_sync_enter(self.ticket)
            let count = self.ticket - 1
            self.ticket = count
            print("\(userName)买了一张票，剩余票数\(self.ticket)")
//            objc_sync_exit(self.ticket)
        }
    }
    
    func arrSecurity() {
        let queue = DispatchQueue.global()
         
        var animals = ["dog", "cat", "pig"]
         
        queue.async {
//            let count = animals.count
//            for index in 0 ..< count {
//                print(index)
//                print("\(animals[index])")
//                Thread.sleep(forTimeInterval: 1)
//            }

            queue.async { [animals] in
                let count = animals.count
                for index in 0 ..< count {
                    print("\(animals[index])")
                    Thread.sleep(forTimeInterval: 1)
                }
            }
        }
         
        queue.async {
            Thread.sleep(forTimeInterval: 0.5)
            animals.remove(at: 0)
        }
    }
    
    
    
}
